#ifndef _EVENT_APP_H_
#define _EVENT_APP_H_

#include <stdint.h>
#include <stdbool.h>
#include "event_board.h"
#include "event_timed_task.h"

// 设备自检启动延时         - 2s
#define SELF_TEST_STARTUP_DELAY_TIME                        (2ul)
// 警报任务运行超时时间     - 1s
#define ALARM_TASK_RUN_TIMEOUT                              (1ul)
// 普通任务运行超时时间     - 60s
#define NORMAL_TASK_RUN_TIMEOUT                             (60ul)
// 提示任务运行超时事件     - 3s
#define TIP_TASK_RUN_TIMEOUT                                (3ul)
// 等待设备重置结果超时时间 - 10s
#define WAIT_DEVICE_RESET_RESULT_TIMEOUT                    (10ul)
// 等待设备自检结果超时时间 - 30s
#define WAIT_DEVICE_SELF_TEST_RESULT_TIMEOUT                (30ul)
// 在线注册用户超时时间     - 10s
#define ONLINE_REGISTER_USER_TIMEOUT                        (10ul)
// 设备复位事件延时执行时间 - 1s
#define DEVICE_RESET_EVENT_DELAY_EXECUTE_TIME               (1ul)
// 恢复出厂事件延时执行时间 - 1s
#define DEVICE_FACTORY_SETTING_EVENT_DELAY_EXECUTE_TIME     (3ul)
// 设备待机超时时间        - 2s
#define DEVICE_STANDBY_TIMEOUT                              (2ul)
// 定时任务间隔唤醒时间    - 1s
#define TIMED_TASK_INTERVAL_WAKEUP_TIME                     (1ul)
// 固件更新延时复位时间    - 6s
#define FIRMWARE_UPDATE_DELAY_RESET_TIME                    (6ul)
// 固件更新任务执行超时时间 - 1s
#define FIRMWARE_UPDATE_TASK_RUN_TIMEOUT                    (1ul)
// 引导程序固件任务执行超时时间   - 30s
#define BOOTLOADER_FIRMWARE_UPDATE_TASK_RUN_TIMEOUT         (30ul)
// 
#define APP_FIRMWARE_UPDATE_DELAY_RESET_TIME                FIRMWARE_UPDATE_DELAY_RESET_TIME

// 消息发送超时时间
#if _NETWOK_MODLE_TYPE_ == _TP1107_MODULE_
// TP1107 发送超时时间    - 7min
#define MESSAGE_SEND_TIMEOUT                                (7 * 60)
#else
// ML307 发送超时时间    - 2min
#define MESSAGE_SEND_TIMEOUT                                (1 * 60)
#endif

// 在线注册重试次数        - 5次
#define MAX_ONLINE_REGISTER_RETRY_COUNT                     (5ul)
// 异常鉴权系统保护临界次数 - 5次
#define NUMBER_OF_FALSE_TIGGERS                             (5ul)
// 异常鉴权重置时间        - 5min
#define AUTHENTICATION_FAILURE_RESET_TIME                   (5ul)

// 异常信息标志
#define EXCEPTION_FLAG                                      PROTOCOL_DUMMY_CODING

/**
 * @brief 功能按键详情
 *
 */
typedef enum
{
  GETTING_NETWORK_QUALITY,      // 获取网络质量
  SET_LOCK_ALWAYS_OPEN,         // 设置锁常开
  GET_BATTERY_PERCENTAGE,       // 获取电量百分比
  ENABLE_NETWORK_ATTACHMENT,    // 启动网络附着
  DEVICE_START_FACTORY_SETTING, // 启动恢复出厂
  FORCE_DEVICE_RESET,           // 强制设备重置
  END_OF_REVIEW,
} FunctionKey_t;

/**
 * @brief 设备动作
 *
 */
typedef enum
{
  DEV_ALARM_PICK_LOCK,                    // 撬锁
  DEV_REBBOOT,                            // 重启
  DEV_FACTORY_SETTING,                    // 恢复出厂
  DEV_BOOTLOADER_UPDATA,                  // 引导程序升级
  DEV_APPLCATION_UPDATA,                  // 应用升级
  DEV_SELF_TEST,                          // 自检
  DEV_PUSH_STATUS_ONLINE_REGISTER_RESULT, // 推送在线注册用户结果
  DEV_ONLINE_REGISTER,                    // 在线注册
  DEV_LOCAL_REGISTER,                     // 本地注册
  DEV_ALARM_KEY_IN,                       // 钥匙插入
  DEV_UNLOCK,                             // 开锁
  DEV_KEY_IN_ADMIN_PASSWORD,              // 键入管理员密码
  DEV_VERIFY_NORMAL_OPEN_PERMISSION,      // 验证常开权限
  DEV_TIP_DEVICE_IN_LOCKED,               // 设备处于锁定状态
  DEV_KEYSCANF,                           // 键入密码
  DEV_SAFETY_AUTHENTICATION,              // 外部验证
  DEV_READ_CARD,                          // 读取卡片
  DEV_ALARM_EVENT_REPORTING,              // 警报事件上报
  DEV_INFORMATION_REPORTING,              // 信息上报
  DEV_ACTIVELY_REQUEST_SERVER_MESSAGE,    // 主动请求服务器消息
  DEV_REQUEST_SERVER_MESSAGE,             // 请求服务器消息
  DEV_TIP_FALSE_LOCKED,                   // 提示假锁
  DEV_TIP_LOCKED_IN,                      // 提示反锁
  DEV_WIRELESS_WAKEUP,                    // 无线验证
  DEV_UPDATE_BLUETOOTH_RADIO,             // 更新蓝牙广播
  DEV_STANDBY,                            // 待机
} SystemAction_t;

/**
 * @brief 任务调度动作
 *
 */
typedef enum
{
  TASK_SCHEDULE_GET,     // 获取任务
  TASK_SCHEDULE_DELETE,  // 删除任务
  TASK_SCHEDULE_TIMEOUT, // 任务执行超时
} TaskScheduleAction_t;

/**
 * @brief 固件更新状态
 *
 */
typedef enum
{
  FIRMWARE_UPDATE_STATUS_IDLE,    // 空闲
  FIRMWARE_UPDATE_STATUS_START,   // 启动
  FIRMWARE_UPDATE_STATUS_ERROR,   // 错误
  FIRMWARE_UPDATE_STATUS_SUCCESS, // 成功
} FirmwareUpdateStatus_t;

/**
 * @brief 设备自检顺序
 *
 */
typedef enum
{
  SELF_TEST_WAIT,               // 等待
  RFID_DEV_SELF_TEST,           // RFID
  KEYBOARD_DEV_SELF_TEST,       // 键盘
  SAFETY_MODULE_DEV_SELF_TEST,  // 外部验证模组
  NETWORK_MODULE_DEV_SELF_TEST, // 网络模组
  ALL_MODULE_SELF_TEST_SUCCESS, // 所有板载硬件已自检
} SelfTestOrder_t;

/**
 *
 * @brief 设备自检状态
 *
 */
typedef enum
{
  SELF_TEST_IDLE,                // 空闲
  SELF_TEST_COMPLETE,            // 自检完成
  OBTAIN_SELF_TEST_EQUIPMENT,    // 获取自检设备
  START_MODULE_SELF_TEST_TASK,   // 启动自检任务
  WAIT_DEVICE_SELF_TEST_TIMEOUT, // 等待设备自检超时
} SelfTestStatus_t;

/**
 * @brief 设备自检结果
 *
 */
typedef enum
{
  DEV_SELF_TEST_IDLE,       // 空闲
  DEV_SELF_TEST_ERROR,      // 失败
  DEV_SELF_TEST_SUCCESS,    // 成功
  DEV_SELF_TEST_NO_SUPPORT, // 设备不支持
} DeviceSelfTestResult_t;

/**
 * @brief 获取设备自检类型结果
 *
 */
typedef enum
{
  DEV_GET_SELF_TEST_ERR,     // 错误
  DEV_GET_SELF_TEST_DONE,    // 完成
  DEV_GET_SELF_TEST_RETRY,   // 重试
  DEV_GET_SELF_TEST_SUCCESS, // 成功
} DevGetSelfTestResult_t;

/**
 * @brief 恢复出厂设置步骤
 *
 */
typedef enum
{
  DEVICE_RESET_WAIT,               // 等待
  DELETE_SAFETY_MODULE_DATA,       // 删除外部验证模组参数
  DELETE_NETWORK_MODULE_DATA,      // 删除无线模组参数
  ALL_MODULE_DELETED_OVER_SUCCESS, // 所有模组已经初始化
} DeviceResetStep_t;

/**
 * @brief 获取重置设备类型结果
 *
 */
typedef enum
{
  GET_RESET_RESULT_ERR,     // 错误
  GET_RESET_RESULT_DONE,    // 完成
  GET_RESET_RESULT_RETRY,   // 重试
  GET_RESET_RESULT_SUCCESS, // 成功
} GetDeviceResetResult_t;

/**
 * @brief 重置模组状态
 *
 */
typedef enum
{
  DEVICE_RESET_IDLE,          // 空闲
  GETTING_RESET_DEVICE,       // 获取待重置的设备
  INITIATE_DEVICE_RESET,      // 启动重置任务
  WAIT_DEVICE_RESET_TIMEOUT,  // 等待设备重置结果
  RESET_ALL_MODULES_COMPLETE, // 重置所有模组完毕
} DeviceResetStatus_t;

/**
 * @brief 网络附着状态
 *
 */
typedef enum
{
  NETWORK_CLOSED,                  // 关闭
  NETWORK_CONNECT_ERROR,           // 连接错误
  NETWORK_CONNECT_SUCCESS,         // 连接成功
  NETWORK_LINKS_BEING_ESTABLISHED, // 正在建立链接
} NetworkAttachmentStatus_t;

/**
 * @brief 锁保护标志位
 *
 */
typedef struct
{
  uint8_t LockedEn      : 1; // 锁保护标识
  uint8_t NumberOfError : 7; // 错误次数
  uint32_t EndTimestamp;     // 锁保护结束时间
} LockedStatusBit_t;

/**
 * @brief 设备故障
 *
 */
typedef union
{
  uint8_t Ident;

  struct
  {
    uint8_t Rfid     : 2; // 读卡
    uint8_t Safety   : 2; // 外部验证模组
    uint8_t Network  : 2; // 网络
    uint8_t Keyboard : 2; // 键盘
  } FailureBit;
} DeviceFailureIdent_t;

/**
 * @brief 设备自检状态
 *
 */
typedef struct
{
  SelfTestOrder_t Order;             // 自检顺序
  SelfTestStatus_t Status;           // 自检状态
  DeviceFailureIdent_t FailureIdent; // 设备故障标识
} SelfTestStatusBit_t;

/**
 * @brief 系统状态位
 *
 */
typedef struct
{
  uint16_t WakeupEn             : 1; // 设备唤醒标识
  uint16_t NormalOpenEn         : 1; // 常开
  uint16_t StatusUpdateEn       : 1; // 状态更新标识
  uint16_t VoicePlayBusyEn      : 1; // 音频播放标识
  uint16_t InitializationEn     : 1; // 初始化标识
  uint16_t MessageQueueBusyEn   : 1; // 消息队列繁忙
  uint16_t BluetoothConnectEn   : 1; // 蓝牙连接标识
  uint16_t LogNeedToBeUploaded  : 1; // 日志需要上传
  uint16_t NetworkConnectStatus : 3; // 网络附着状态
  uint16_t Reserved             : 5; // 保留
} DeviceStatusBit_t;

/**
 * @brief 设备重置结果
 *
 */
typedef struct
{
  DeviceResetStep_t Step;     // 执行步骤
  DeviceResetStatus_t Status; // 执行状态
} DeviceResetStatusBit_t;

/**
 * @brief 固件更新状态
 *
 */
typedef struct
{
  uint32_t CrcValue;             // 文件crc校验值
  uint32_t FileSize;             // 文件大小
  FirmwareUpdateStatus_t Status; // 更新状态
} FirmwareUpdateStatusBit_t;

/**
 * @brief 本地注册相关参数
 *
 */
typedef struct
{
  uint8_t Step;   // 本地注册步骤
  uint8_t Result; // 本地注册状态
} LocalRegisterStatusBit_t;

/**
 * @brief 在线注册相关参数
 *
 */
typedef struct
{
  uint8_t Result;                   // 注册状态
  uint8_t FileReceiveFailNumber;    // 文件接收失败数量
  uint8_t FileReceiveSuccessNumber; // 文件接收成功数量
} OnlineRegisterStatusBit_t;

/**
 * @brief 状态位
 *
 */
typedef struct
{
  LockedStatusBit_t LockedStatusBit;               // 锁保护状态位
  DeviceStatusBit_t DeviceStatusBit;               // 系统状态
  SelfTestStatusBit_t SelfTestStatus;              // 自检状态
  TaskScheduleAction_t TaskScheduleAction;         // 任务调度动作
  DeviceResetStatusBit_t DeviceResetStatus;        // 重置状态
  OnlineRegisterStatusBit_t OnlineRegisterStatus;  // 在线注册状态
  LocalRegisterStatusBit_t LocalRegisterStatusBit; // 本地注册状态
} EventCenterStatusBit_t;




/**
 * @brief 心跳定时器使能配置
 *
 * @param En - 使能标志（true：使能 false：失能）
 */
extern void EventGetServerMessageTimerConfig(bool En);

/**
 * @brief 任务调度定时器使能配置
 *
 * @param En - 使能标志（true：使能 false：失能）
 */
extern void EventTaskScheduleTimerConfig(bool En);

/**
 * @brief 网络保活定时器使能配置
 *
 * @param En - 使能配置（true：使能 false：失能）
 */
extern void EventNetworkKeepLiveTimerConfig(bool En);

/**
 * @brief 鉴权错误重置定时器使能配置
 *
 * @param En - 使能标志（true：使能 false：失能）
 */
extern void EventResetAuthenticationErrorResetTimerConfig(bool En);

/**
 * @brief 获取心跳定时器使能
 *
 * @return bool - 使能标志（true：使能 false：失能）
 */
extern bool EventGetServerMessageTimerConfigEn(void);

/**
 * @brief 获取任务调度定时器使能
 *
 * @return bool - 使能标志（true：使能 false：失能）
 */
extern bool EventGetTaskScheduleTimerConfigEn(void);

/**
 * @brief 获取网络保活定时器使能
 *
 * @return bool - 使能标志（true：使能 false：失能）
 */
extern bool EventGetNetworkKeepLiveTimerConfigEn(void);

/**
 * @brief 获取鉴权错误重置定时器使能
 *
 * @return bool - 使能标志（true：使能 false：失能）
 */
extern bool EventGetResetAuthenticationErrorResetEn(void);

/**
 * @brief 重置心跳累加时间
 *
 */
extern void EventResetAccumulatedTimeOfGetServerMessage(void);

/**
 * @brief 重置网络保活累加时间
 *
 */
extern void EventResetAccumulatedTimeOfNetworkKeepLive(void);

/**
 * @brief 重置任务调度累计时间
 *
 */
extern void EventResetAccumulatedTimeOfTaskSchedule(void);

/**
 * @brief 重置鉴权错误重置时间
 *
 */
extern void EventResetAuthenticationErrorResetTimer(void);

/**
 * @brief 更新心跳间隔
 *
 * @param Interval - 心跳间隔
 */
extern void EventUpdateGetServerMessageInterval(uint32_t Interval);

/**
 * @brief 更新任务调度间隔
 *
 * @param Interval - 任务调度间隔
 */
extern void EventUpdateTaskScheduleInterval(uint32_t Interval);

/**
 * @brief 更新网络保活间隔
 *
 * @param Interval - 网络保活间隔
 */
extern void EventUpdateNetworkKeepLiveInterval(uint32_t Interval);

/**
 * @brief 更新重置鉴权错误定时器间隔
 *
 * @param Interval - 重置间隔时间
 */
extern void EventUpdateAuthenticationErrorResetInterval(uint32_t Interval);

/**
 * @brief 获取本地注册密钥步骤
 *
 * @return uint8_t - 本地注册步骤
 */
extern uint8_t EventGetLocalRegisterKeyStep(void);

/**
 * @brief 设置本地注册密钥步骤
 *
 * @param Step - 本地注册步骤
 */
extern void EventSetLocalRegisterKeyStep(uint8_t Step);

/**
 * @brief 获取本地注册密钥结果
 *
 * @return uint8_t - 本地注册结果
 */
extern uint8_t EventGetLocalRegisterKeyResult(void);

/**
 * @brief 更新本地注册密钥结果
 *
 * @param Result - 本地注册结果
 */
extern void EventUpdateLocalRegisterKeyResult(LocalRegisterResult_t Result);

/**
 * @brief 获取在线注册结果
 *
 * @return RegisterResult_t - 在线注册结果
 */
extern RegisterResult_t EventGetOnlineRegisterResult(void);

/**
 * @brief 更新在线注册结果
 *
 * @param Result - 在线注册结果
 */
extern void EventUpdateOnlineRegisterResult(RegisterResult_t Result);

/**
 * @brief 启动设备复位
 *
 * @return bool - 执行状态（true：成功 false：失败）
 */
extern bool EventStartDeviceRebootTask(void);

/**
 * @brief 退出设备复位任务
 *
 * @return bool - 执行状态（true：成功 false：失败）
 */
extern bool EventExitRebootTask(void);

/**
 * @brief 启动设备恢复出厂
 *
 * @return bool - 执行状态（true：成功 false：失败）
 */
extern bool EventStartFactorySettingTask(void);

/**
 * @brief 退出设备恢复出厂任务
 *
 * @return bool - 执行状态（true：成功 false：失败）
 */
extern bool EventExitFactorySettingTask(void);

/**
 * @brief 获取引导程序更新文件属性
 *
 * @param pCrcValueOut - 文件crc校验值
 * @param pFileSizeOut - 文件大小
 * @return bool        - 执行状态（true：成功 false：失败）
 */
extern bool EventGetFirmwareDataInformation(uint32_t *pCrcValueOut, uint32_t *pFileSizeOut);

/**
 * @brief 启动引导程序更新任务
 *
 * @param FileId   - 文件编码
 * @param FileSize - 文件大小
 * @return bool - 执行状态（true：成功 false：失败）
 */
extern bool EventStartBootloaderUpdateTask(uint32_t FileId, uint32_t FileSize);

/**
 * @brief 退出固件更新任务
 *
 * @param UpdateStatus - 更新状态
 * @return bool        - 执行状态（true：成功 false：失败）
 */
extern bool EventExitBootloaderUpdateTask(FirmwareUpdateStatus_t UpdateStatus);

/**
 * @brief 启动应用程序更新任务
 *
 * @return bool - 执行状态（true：成功 false：失败）
 */
extern bool EventStartApplicationUpdateTask(void);

/**
 * @brief 退出应用程序更新任务
 *
 * @return bool - 执行状态（true：成功 false：失败）
 */
extern bool EventExitApplicationUpdateTask(void);

/**
 * @brief 启动设备自检
 *
 * @return bool - 执行状态（true：成功 false：失败）
 */
extern bool EventStartDeviceSelfTestTask(void);

/**
 * @brief 退出设备自检任务
 *
 * @return bool - 执行状态（true：成功 false：失败）
 */
extern bool EventExitDeviceSelfTestTask(void);

/**
 * @brief 启动键入管理员密码任务
 *
 * @return bool - 任务启动状态（true：成功 false：失败）
 */
extern bool EventStartKeyInAdminPasswordTask(void);

/**
 * @brief 退出键入管理员密码任务
 *
 * @param pPasswordIn      - 管理员密码
 * @param NumberOfPassword - 密码长度
 * @return bool            - 执行状态（true：成功 false：失败）
 */
extern bool EventExitKeyInAdminPasswordTask(const void *pDataIn, uint8_t SizeIn);

/**
 * @brief 启动验证常开权限任务
 *
 * @return bool - 任务启动状态（true：成功 false：失败）
 */
extern bool EventStartVerifyNormalOpenPermissionTask(void);

/**
 * @brief 退出验证常开权限任务
 *
 * @param KeyType       - 密钥类型
 * @param pKeyIn        - 密钥
 * @param NumberOfKeyIn - 密钥长度
 * @return bool          - 执行状态（true：成功 false：失败）
 */
extern bool EventExitVerifyNormalOpenPermissionTask(uint8_t KeyType, const void *pKeyIn, uint8_t NumberOfKeyIn);

/**
 * @brief 退出请求服务器消息任务
 *
 * @param SendStatus - 发送状态
 * @return bool      - 执行状态（true：成功 false：失败）
 */
extern bool EventExitRequestServerInformationTask(uint8_t SendStatus);

/**
 * @brief 启动请求服务器消息任务
 *
 * @return bool - 任务启动状态（true：成功 false：失败）
 */
extern bool EventStartRequestServerInformationTask(void);

/**
 * @brief 退出主动请求服务器消息任务
 *
 * @param SendStatus -  发送状态
 * @return bool      - 执行状态（true：成功 false：失败）
 */
extern bool EventExitActivelyRequestServerTask(uint8_t SendStatus);

/**
 * @brief 启动主动请求服务器消息任务
 *
 * @return bool - 任务启动状态（true：成功 false：失败）
 */
extern bool EventStartActivelyRequestServerTask(void);

/**
 * @brief 退出上报在线注册结果任务
 *
 * @param SendStatus - 发送状态
 * @return bool      - 执行状态（true：成功 false：失败）
 */
extern bool EventExitPushOnlineRegisterStatusTask(uint8_t SendStatus);

/**
 * @brief 启动上报在线注册结果任务
 *
 * @param pRegisterInformationIn - 注册密钥信息
 * @return bool                  - 任务启动状态（true：成功 false：失败）
 */
extern bool EventStartPushOnlineRegisterStatusTask(OnlineRegisterResultFormat_t *pRegisterInformationIn);

/**
 * @brief 退出信息上报任务
 *
 * @param SendStatus - 发送状态
 * @return bool      - 执行状态（true：成功 false：失败）
 */
extern bool EventExitInformationReportingTask(uint8_t SendStatus);

/**
 * @brief 启动信息上报任务
 *
 * @param LogId                 - 日志编码
 * @param LogType               - 日志类型
 * @param pAuthenticationCodeIn - 授权码
 * @return bool                 - 任务启动状态（true：成功 false：失败）
 */
extern bool EventStartInformationReportingTask(uint16_t LogId, uint8_t LogType, const void *pAuthenticationCodeIn);

/**
 * @brief 退出上报警报事件任务
 *
 * @param SendStatus - 发送状态
 * @return bool      - 执行状态（true：成功 false：失败）
 */
extern bool EventExitAlarmReportingTask(uint8_t SendStatus);

/**
 * @brief 启动上报警报事件任务
 *
 * @param LogId    - 日志编码
 * @param LogType  - 日志类型
 * @param TiggerEn - 触发状态
 * @return bool    - 任务启动状态（true：成功 false：失败）
 */
extern bool EventStartAlarmReportingTask(uint16_t LogId, uint8_t LogType, uint8_t TiggerEn);

/**
 * @brief 获取本地注册密钥任务启动状态
 *
 * @return bool - 任务启动状态（true：成功 false：失败）
 */
extern bool EventGetLocalRegisterKeyStartEn(void);

/**
 * @brief 获取进入管理员密码任务启动状态
 *
 * @return bool - 任务启动状态（true：成功 false：失败）
 */
extern bool EventGetKeyInAdminPasswordTaskStartEn(void);

/**
 * @brief 获取验证常开权限任务启动状态
 *
 * @return bool - 任务启动状态（true：成功 false：失败）
 */
extern bool EventGetVerifyNormalOpenPermissionTaskStartEn(void);

/**
 * @brief 退出本地注册密钥任务
 *
 * @param KeyType       - 密钥类型
 * @param pKeyIn        - 密钥
 * @param NumberOfKeyIn - 密钥长度
 * @return bool         - 任务启动状态（true：成功 false：失败）
 */
extern bool EventExitLocalRegisterKeyTask(EventKeyType_t KeyType, const void *pKeyIn, uint8_t NumberOfKeyIn);

/**
 * @brief 启动本地注册用户任务
 *
 * @param pRegisterInformationIn - 注册密钥信息
 * @return bool                  - 任务启动状态（true：成功 false：失败）
 */
extern bool EventStartLocalRegisterKeyTask(RegisterKeyInformation_t *pRegisterInformationIn);

/**
 * @brief 退出在线注册用户任务
 *
 * @param KeyType       - 密钥类型
 * @param pKeyIn        - 密钥
 * @param NumberOfKeyIn - 密钥长度
 * @return bool         - 执行状态（true：成功 false：失败）
 */
extern bool EventExitOnlineRegisterTask(uint8_t KeyType, const void *pKeyIn, uint8_t NumberOfKeyIn);

/**
 * @brief 启动在线注册用户任务
 *
 * @param pRegisterInformationIn - 注册密钥信息
 * @return bool                  - 任务启动状态（true：成功 false：失败）
 */
extern bool EventStartOnlineRegisterTask(OnlineRegisterInformation_t *pRegisterInformationIn);

/**
 * @brief 退出设备解锁任务
 *
 * @return bool - 执行状态（true：成功 false：失败）
 */
extern bool EventExitExecuteUnlockTask(void);

/**
 * @brief 执行设备解锁任务
 *
 * @param KeyType      - 密钥类型
 * @param pKeyValueIn  - 密钥值
 * @param EndTimestamp - 授权结束时间
 * @param UnlockType   - 解锁方式
 * @return bool        - 执行状态（true：成功 false：失败）
 */
extern bool EventExecuteUnlockTask(const uint8_t KeyType, const uint8_t *pKeyValueIn, uint32_t EndTimestamp, uint8_t UnlockType);

/**
 * @brief 退出提示设备处于锁定状态任务
 *
 * @return bool - 执行状态（true：成功 false：失败）
 */
extern bool EventExitDeviceLockTipTask(void);

/**
 * @brief 启动提示设备处于锁定状态任务
 *
 * @return bool - 任务启动状态（true：成功 false：失败）
 */
extern bool EventStartDeviceLockTipTask(void);

/**
 * @brief 退出读取卡片数据任务
 *
 * @param pCardSerialNumber        - 卡片序列号
 * @param NumberOfCardSerialNumber - 卡片序列号长度
 * @return bool                    - 执行状态（true：成功 false：失败）
 */
extern bool EventExitReadCardDataTask(const void *pCardSerialNumber, uint8_t NumberOfCardSerialNumber);

/**
 * @brief 启动读取卡片数据任务
 *
 * @return bool - 任务启动状态（true：成功 false：失败）
 */
extern bool EventStartReadCardDataTask(void);

/**
 * @brief 退出外部模组验证任务
 *
 * @param KeyType       - 密钥类型
 * @param pKeyIn        - 输入键值
 * @param NumberOfKeyIn - 键值长度
 * @return bool         - 执行状态（true：成功 false：失败）
 */
extern bool EventExitExternalModuleVerificationTask(uint8_t KeyType, const void *pKeyIn, uint8_t NumberOfKeyIn);

/**
 * @brief 启动外部模组验证任务
 *
 * @return bool - 任务启动状态（true：成功 false：失败）
 */
extern bool EventStartExternalModuleVerificationTask(void);

/**
 * @brief 退出键盘输入任务
 *
 * @param pKeyIn        - 输入键值
 * @param NumberOfKeyIn - 键值长度
 * @return bool         - 执行状态（true：成功 false：失败）
 */
extern bool EventExitKeyScanfTask(const void *pKeyIn, uint8_t NumberOfKeyIn);

/**
 * @brief 启动键盘输入任务
 *
 * @return bool - 任务启动状态（true：成功 false：失败）
 */
extern bool EventStartKeyScanfTask(void);

/**
 * @brief 退出反锁提示任务
 *
 * @return bool - 执行状态（true：成功 false：失败）
 */
extern bool EventExitLockedInTipTask(void);

/**
 * @brief 启动反锁提示任务
 *
 * @return bool - 任务启动状态（true：成功 false：失败）
 */
extern bool EventStartLockedInTipTask(void);

/**
 * @brief 退出假锁提示任务
 *
 * @return bool - 执行状态（true：成功 false：失败）
 */
extern bool EventExitFalseLockedTipTask(void);

/**
 * @brief 启动假锁提示任务
 *
 * @return bool - 任务启动状态（true：成功 false：失败）
 */
extern bool EventStartFalseLockedTipTask(void);

/**
 * @brief 提出撬锁提示任务
 *
 * @return bool - 执行状态（true：成功 false：失败）
 */
extern bool EventExitPickLockTipTask(void);

/**
 * @brief 启动撬锁提示任务
 *
 * @return bool - 任务启动状态（true：成功 false：失败）
 */
extern bool EventStartPickLockTipTask(void);

/**
 * @brief 退出钥匙插入提示任务
 *
 * @return bool - 执行状态（true：成功 false：失败）
 */
extern bool EventExitKeyInstallTipTask(void);

/**
 * @brief 启动钥匙插入提示任务
 *
 * @return bool - 任务启动状态（true：成功 false：失败）
 */
extern bool EventStartKeyInstallTipTask(void);

/**
 * @brief 退出无线唤醒任务
 *
 * @return bool - 执行状态（true：成功 false：失败）
 */
extern bool EventExitWirelessWakeupTask(void);

/**
 * @brief 启动无线唤醒任务
 *
 * @return bool - 任务启动状态（true：成功 false：失败）
 */
extern bool EventStartWirelessWakeupTask(void);

/**
 * @brief 退出更新蓝牙广播任务
 *
 * @return bool - 执行状态（true：成功 false：失败）
 */
extern bool EventExitUpdateBluetoothRadioTask(void);

/**
 * @brief 启动更新蓝牙广播任务
 *
 * @return bool - 任务启动状态（true：成功 false：失败）
 */
extern bool EventStartUpdateBluetoothRadioTask(void);

/**
 * @brief 标志退出待机模式任务
 *
 * @return bool - 执行状态（true：成功 false：失败）
 */
extern bool EventExitStadnbyTask(void);

/**
 * @brief 进入待机模式
 *
 * @return bool - 任务启动状态（true：成功 false：失败）
 */
extern bool EventStartStadnbyTask(void);

/**
 * @brief 获取在线注册密钥信息
 *
 * @param pRegisterInformationOut - 注册密钥信息
 * @return bool                   - 获取状态（true：成功 false：失败）
 */
extern bool EventGetOnlineRegisterKeyInformation(OnlineRegisterInformation_t *pRegisterInformationOut);

/**
 * @brief 获取是否触发某个动作
 *
 * @return bool - 触发状态（true：触发 false：静默）
 */
extern bool EventGetActionTriggerStatus(SystemAction_t Action);

/**
 * @brief 重置特定动作运行时间
 *
 * @param Action - 动作类型
 * @return bool  - 执行状态（true：成功 false：失败）
 */
extern bool EventResetTheRunningTimeOfSpecificAction(SystemAction_t Action);

/**
 * @brief 删除特定动作
 *
 * @param Action - 动作类型
 */
extern void EventDeleteSpecificAction(SystemAction_t Action);

/**
 * @brief 获取系统保护位
 *
 * @return bool - 系统保护位使能标志（true：使能 false：失能）
 */
extern bool EventGetSystemProtectionIdentifier(void);

/**
 * @brief 标识模组自检结果
 *
 * @param DeviceType     - 设备类型
 * @param SelftestResult - 自检结果
 */
extern void EventMarkingModuleSelfTestResults(SelfTestOrder_t DeviceType, bool SelftestResult);

/**
 * @brief 标识模组重置结果
 *
 * @param DeviceType  - 设备类型
 * @param ResetResult - 重置结果
 */
extern void EventMarkingModuleResetResult(DeviceResetStep_t DeviceType, bool ResetResult);

/**
 *
 * @brief 获取读卡芯片故障标识
 *
 * @return uint16_t - 故障标识
 */
extern uint16_t EventGetRfidCommunicationFaultyIdent(void);

/**
 * @brief 获取键盘故障标识
 *
 * @return uint16_t - 故障标识
 */
extern uint16_t EventGetKeyboardCommunicationFaultyIdent(void);

/**
 * @brief 获取外部验证模组故障标识
 *
 * @return uint16_t - 故障标识
 */
extern uint16_t EventGetSafetyModuleCommunicationFaultyIdent(void);

/**
 * @brief 获取网络通讯故障标识
 *
 * @return uint16_t - 故障标识
 */
extern uint16_t EventGetNetworkCommunicationFaultyIdent(void);

/**
 * @brief 获取设备自检结果
 *
 * @return SelfTestOrder_t - 当前自检状态
 */
extern SelfTestOrder_t EventGetSelfTestResult(void);

/**
 * @brief 获取设备唤醒标识
 *
 * @return bool - 唤醒标志（true：使能 false：失能）
 */
extern bool EventGetDeviceWakeupFlagBit(void);

/**
 * @brief 设置设备唤醒标识
 *
 * @param En - 唤醒标志（true：使能 false：失能）
 */
extern void EventSetDeviceWakeupFlagBit(bool En);

/**
 * @brief 获取常开使能标识
 *
 * @return bool - 常开使能标志（true：使能 false：失能）
 */
extern bool EventGetNormalOpenFlagBit(void);

/**
 * @brief 设置常开使能标识
 *
 * @param En - 常开使能标志（true：使能 false：失能）
 */
extern void EventSetNormalOpenFlagBit(bool En);

/**
 * @brief 获取状态更新标识
 *
 * @return bool - 状态更新标志（true：使能 false：失能）
 */
extern bool EventGetStatusUpdateFlagBit(void);

/**
 * @brief 设置状态更新标识
 *
 * @param En - 状态更新标志（true：使能 false：失能）
 */
extern void EventSetStatusUpdateFlagBit(bool En);

/**
 * @brief 获取音频播放繁忙标志位
 *
 * @return bool - 繁忙标志（true：繁忙 false：空闲）
 */
extern bool EventGetVoicePlayBusyFlagBit(void);

/**
 * @brief 设置音频播放繁忙标志位
 *
 * @param En - 繁忙标志（true：繁忙 false：空闲）
 */
extern void EventSetVoicePlayBusyFlagBit(bool En);

/**
 * @brief 获取设备初始化标识
 *
 * @param bool - 初始化标志（true：繁忙 false：空闲）
 */
extern bool EventGetDeviceInitializationFlagBit(void);

/**
 * @brief 设置设备初始化标识
 *
 * @param En - 初始化标志（true：繁忙 false：空闲）
 */
extern void EventSetDeviceInitializationFlagBit(bool En);

/**
 * @brief 获取消息队列繁忙标志位
 *
 * @return bool - 使能标志（true：使能 false：失能）
 */
extern bool EventGetMessageQueueBusyFlagBit(void);

/**
 * @brief 设置消息队列繁忙标志位
 *
 * @param En - 使能标志（true：使能 false：失能）
 */
extern void EventSetMessageQueueBusyFlagBit(bool En);

/**
 * @brief 设置蓝牙连接标志位
 *
 * @return bool - 使能标志（true：使能 false：失能）
 */
extern bool EventGetBluetoothConnectFlagBit(void);

/**
 * @brief 设置蓝牙连接标志位
 *
 * @param En - 使能标志（true：使能 false：失能）
 */
extern void EventSetBluetoothConnectFlagBit(bool En);

/**
 * @brief 获取日志上传标志位
 *
 * @return bool - 上传标志（true：上传 false：不上传）
 */
extern bool EventGetLogNeedToBeUploadedFlagBit(void);

/**
 * @brief 设置日志上传标志位
 *
 * @param En - 上传标志（true：上传 false：不上传）
 */
extern void EventSetLogNeedToBeUploadedFlagBit(bool En);

/**
 * @brief 获取网络连接状态
 *
 * @return uint8_t - 网络连接状态
 */
extern uint8_t EventGetNetworkConnectStatus(void);

/**
 * @brief 设置网络连接状态
 *
 * @param Status - 网络连接状态
 * @return bool  - 设置状态（true：成功 false：失败）
 */
extern bool EventSetNetworkConnectStatus(uint8_t Status);

/**
 * @brief 系统启动
 *
 */
extern void EventSystemStartup(void);

/**
 * @brief 设备已反锁
 *
 * @param KeyType - 密钥类型
 */
extern void EventDeviceAutiLock(uint8_t KeyType);

/**
 * @brief 卡片已顶替
 *
 * @param KeyType - 密钥类型
 */
extern void EventCardReplace(uint8_t KeyType);

/**
 * @brief 卡片归属出错
 *
 */
extern void EventCardAffiliationError(void);

/**
 * @brief 该功能卡已禁用
 * 
 */
extern void EventThisFunctionCardHasBeenDisabled(void);

/**
 * @brief 提示参数设置状态
 *
 * @param SetResult - 参数设置状态（true：成功 false：失败）
 */
extern void EventHintParameterSetStatus(uint8_t SetResult);

/**
 * @brief 持卡人不在有效期
 *
 * @param KeyType - 密钥类型
 */
extern void EventCardholderOutOfDate(uint8_t KeyType);

/**
 * @brief 持卡人鉴权失败
 *
 * @param KeyType - 密钥类型
 */
extern void EventCardholderAuthenticationError(uint8_t KeyType);

/**
 * @brief 网络已断开
 *
 */
extern void EventNetworkDisconnect(void);

/**
 * @brief 新增定时任务
 *
 * @param pTaskNameIn  - 任务名
 * @param Time         - 中断事件回调函数
 * @param TaskCallback - 回调任务
 * @param Level        - 事件级别
 * @param Start        - 自启动（true：是 false：否）
 * @return bool        - 新增状态（true：成功 false：失败）
 */
extern bool EventAddNewTimedTask(TimedListNode_t NewItem, uint32_t Time, TimedTaskLevel Level, ScheduledTask_t TaskCallback, bool Start);

/**
 * @brief 新增事件处理事件表
 *
 * @param NewItem  - 指向静态中断表地址的指针变量
 * @param Event    - 中断事件回调函数
 * @return bool    - 新增状态(ture-成功  false-失败)
 */
extern bool EventAddNewEventHandler(EventHandlerListNode_t NewItem, EventHandler_t EventHandler);

/**
 * @brief 事件数据处理
 *
 */
extern void EventDataHandler(void);

/**
 * @brief 事件处理中心初始化
 *
 */
extern void EventCenterConfiguration(void);

#endif
